/**
 *  jQuery.jsonengine.fn.basic
 */
(function($) {
	/**
	 * jQuery.jsonengine で用いられるアラート表示です。
	 * ユーザーが再定義する事で表示方法が変えられます。
	 */
	$.jsonengine.fn.basic.alert = function(message) {
		aw = $('<div class="jsonengine_alert">')
			.append(message)
			.css({
				margin:0,
				padding:'0.3em',
				background:'yellow',
				position:'fixed',
				top:0,
				display:'none'
			})
			.appendTo('body');
		aw
			.css({left: $('body').outerWidth()/2 - aw.width()/2})
			.fadeIn(200, function() {
				$(this).fadeOut(5000, function(){
					$(this).remove();
				});
				$(this).click(function(){
					$(this).remove();
				});
			});
	};
	/**
	 * jQuery.jsonengine で用いられるログイン警告表示です。
	 * ユーザーが再定義する事で表示方法が変えられます。
	 */
	$.jsonengine.fn.basic.redirectDialog = function(href) {
		if(!href) return;
		$('body').append(
			$('<div>')
				.css({
					margin:0,
					padding:'1em',
					background:'white',
					position:'absolute',
					top:0,
					left:0,
					width:'100%',
					height:'100%'
				})
				.append(
					$('<a>')
						.attr('href',href)
						.append('ログインして下さい')));
	};
	/**
	 * $.jsonengine.fn.basic.success_LOADで使用するリストオブジェクトを返す関数
	 */
	$.jsonengine.fn.basic.list = function(response) {
		return $.jsonengine.utils.json2html(response);
	};
	/**
	 * jsonengineからデータ読み込み成功した際のコールバック関数
	 */
	$.jsonengine.fn.basic.success_LOAD = function(o, response, status) {
		$.jsonengine.fn.basic.redirectDialog(response.redirect);
		//
		tmp = {};
		tmp.query = o.find('div.query');
		tmp.action = o.find('div.action');
		tmp.link_contents = o.find('div.link_contents');
		o.empty();
		o.append(tmp.query).append(tmp.action).append(tmp.link_contents);
		//
		e = $.jsonengine.fn.basic.list(response);
		if(e.html()!==''){
			e.addClass('result');
			o.append(e);
			//
			load = function(o) {
				$('.object_Object').click(function(){
					docId = $.jsonengine.utils.html2json(this)._docId;
					form = $('form[class^=_je_'+$.jsonengine.fn.docType(o)+']:not(form.search)');
					for (i=0; i < form.length; i++) {
						object = {
							"object" :form[i],
							"type"   :"GET",
							"data"   :{}
						};
						object.data._docId = docId;
						$.jsonengine.fn.base(object);
					}
				});
			};
			//
			link1 = function(o) {
				if ($('.result.object_Object', o).length) {
					content = o.children('.link_contents');
					_docId = o.children('.result')
						.children('._docId')
						.children('.object_value')
						.text();
					__clone = content.clone();
					__clone.attr('class', '');
					link = $('a', __clone);
					link.attr('href', link.attr('href') + '#!' + _docId);
					o.append(__clone);
				} else {
					for (i=0; i < o.length; i++) {
						contents = o.eq(i).children('.link_contents');
						src = o.eq(i).children('.result').children();
						for (ii=0; ii < src.length; ii++) {
							docId = src.eq(ii)
								.children()
								.children('._docId')
								.children('.object_value')
								.text();
							_clone = contents.clone();
							_clone.attr('class', '');
							links = $('a', _clone);
							for (iii=0; iii < links.length; iii++) {
								//?を#!に変更する
								links.eq(iii).attr('href', links.eq(iii).attr('href') + '#!' + docId);
							}
							src.eq(ii).append(_clone);
						}
					}
				}
			};
			//
			link2 = function(o) {
				for (i=0; i < o.length; i++) {
					contents = o.eq(i).children('.link_contents');
					contents.attr('class', '');
					src = o.eq(i).children('.result').children();
					for (ii=0; ii < src.length; ii++) {
						docId = src.eq(ii)
							.children()
							.children('._docId')
							.children('.object_value')
							.text();
						link = $('a', contents);
						a = $('<a>')
							.attr('href', link.attr('href') + '#!' + docId)
							.append(src.eq(ii).children());
						src.eq(ii).append(a);
					}
				}
			};
			//
			fromList = function(o) {
				$('.object_Object').click(function(){
					form = $('form[class^=_je_'+$.jsonengine.fn.docType(o)+']:not(form.search)');
					for (i = 0; i < form.length; i++) {
						r = {};
						for (k in form.eq(i).values()) {
							r[k] = "";
						}
						form.eq(i).values(r);
						form.eq(i).values($.jsonengine.utils.html2json(this));
					}
				});
			};
			//eにonclickイベントをセット
			switch (tmp.action.text()) {
				//すでにリスト表示されているデータを元にフォームデータをセット
				default :
					fromList(o);
					break;
				//div.link_contentsがある場合はそのリンクを表示。リンク先にパラメータ_docIdを渡して遷移可能にする
				case 'link1':
					link1(o);
					break;
				//div.link_contentsに指定したリンクがe全体に反映。リンク先にパラメータ_docIdを渡して遷移可能にする
				case 'link2':
					link2(o);
					break;
				//新たにjsonengineからデータを取得しセット
				case 'load':
					load(o);
					break;
				//何もしない
				case 'none':
					break;
			}
		}
	};
	/**
	 * jsonengineからデータ読み込み失敗した際のコールバック関数
	 */
	$.jsonengine.fn.basic.error_LOAD = function(o, xhr, status, thrown){
		o.append($('<div class="error">')
			.append('status:')
				.append($('<span style="color:red;font-weight:bold;">')
					.append(status)));
	};
	/**
	 * jsonengineから1件取得が成功した際のコールバック関数
	 */
	$.jsonengine.fn.basic.success_GET = function(o, response, status) {
		$.jsonengine.fn.basic.redirectDialog(response.redirect);
		$(o).values(response);
	};
	/**
	 * jsonengineから1件取得がが失敗した際のコールバック関数
	 */
	$.jsonengine.fn.basic.error_GET= function(o, xhr, status, thrown){
		$.jsonengine.fn.basic.alert('データを取得できませんでした');
	};
	/**
	 * jsonengineへ新規登録が成功した際のコールバック関数
	 */
	$.jsonengine.fn.basic.success_POST = function(o, response, status) {
		$.jsonengine.fn.basic.redirectDialog(response.redirect);
		if ($(o).attr('class').match(/afterclear/)) {
			o.reset();
		} else {
			$(o).values(response);
		}
		$('*:[class^=_je_]:not(form:[class^=_je_])')._LOAD();
		$.jsonengine.fn.basic.alert('更新しました');
	};
	/**
	 * jsonengineへ新規登録が失敗した際のコールバック関数
	 */
	$.jsonengine.fn.basic.error_POST = function(o, xhr, status, thrown){
		$.jsonengine.fn.basic.alert('更新できませんでした');
	};
	/**
	 * jsonengineへ更新が成功した際のコールバック関数
	 */
	$.jsonengine.fn.basic.success_PUT = function(o, response, status) {
		$.jsonengine.fn.basic.redirectDialog(response.redirect);
		if ($(o).attr('class').match(/afterclear/)) {
			o.reset();
		} else {
			$(o).values(response);
		}
		$('*:[class^=_je_]:not(form:[class^=_je_])')._LOAD();
		$.jsonengine.fn.basic.alert('更新しました');
	};
	/**
	 * jsonengineへ更新が失敗した際のコールバック関数
	 */
	$.jsonengine.fn.basic.error_PUT = function(o, xhr, status, thrown){
		$.jsonengine.fn.basic.alert('更新できませんでした');
	};
	/**
	 * jsonengineで削除が成功した際のコールバック関数
	 */
	$.jsonengine.fn.basic.success_DELETE = function(o, response, status) {
		$.jsonengine.fn.basic.redirectDialog(response.redirect);
		o.reset();
		$('*:[class^=_je_]:not(form:[class^=_je_])')._LOAD();
		$.jsonengine.fn.basic.alert('削除しました');
	};
	/**
	 * jsonengineで削除が失敗した際のコールバック関数
	 */
	$.jsonengine.fn.basic.error_DELETE = function(o, xhr, status, thrown){
		$.jsonengine.fn.basic.alert('削除できませんでした');
	};;
})(jQuery);

